package com.zhang.template.example;

/**
 * @author ElloeStudy(Sifa Zhang)
 * @create 2022-03-03 11:28
 * To: 真常应物，真常得性，常清常静，常清静矣
 */

// 悍马模型
public abstract class HummerModel {
//    // 使得模型能够动起来
//    public abstract void start();
//    // 能动也要能够停下来
//    public abstract void stop();
//    // 能过发出声音
//    public abstract void alarm();
//    // 汽车引擎能够发出轰隆隆的声音
//    public abstract void engineBoom();
//    // 汽车能够跑起来
//    public void run(){
//        this.start();
//        this.engineBoom();
//        this.alarm();
//        this.stop();
//    };


    // 因为用户不需要关心怎么启动的，所以上面四个设为protected（由子类来实现），run()不需要修改，使用final修饰
    // 总的叫基本方法
    // 使得模型能够动起来
    protected abstract void start();    // 抽象方法
    // 能动也要能够停下来
    protected abstract void stop();
    // 能过发出声音
    protected abstract void alarm();
    // 汽车引擎能够发出轰隆隆的声音
    protected abstract void engineBoom();
    // 汽车能够跑起来
    public final void run(){      // 具体方法
        // 模板方法，上面定义的四个方法是必须要实现的，子类不能修改其顺序
        this.start();
        this.engineBoom();
        if (this.isAlarm()){
            this.alarm();
        }
        this.stop();
    };
    protected boolean isAlarm(){   // 钩子函数 默认喇叭是会响的
        // 钩子函数由抽象类来实现，子类是可以重写的
        return true;
    };
}

/**
 * 模板方法模式 就是在模板方法（run）中按照一个的规则和顺序调用基本方法(start,stop等)
 */
